package com.sgcc.pda.hzaidl.impl;


import android.os.RemoteException;

import com.sgcc.pda.hw.IProtocol698Manager;
import com.sgcc.pda.hw.ReturnResult;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * @创建者：suven on 2019/12/17 14:32
 * @描述：
 * @版本：1.0
 * @修改人：
 * @修改时间：
 * @修改说明：
 * @修改版本：
 */
public class Protocol698Manager extends IProtocol698Manager.Stub {
    private static Protocol698Manager mInstance;


    /**
     * 单例
     *
     * @return
     */
    public static synchronized Protocol698Manager getInstance() {
        if (mInstance == null) {
            mInstance = new Protocol698Manager();
        }
        return mInstance;
    }

    /**
     * 698表组装安全传输报文
     *
     * @param meterAddress 表通讯地址
     * @param taskData     数据
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult safeTrans(String meterAddress, String taskData, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_safeTrans", jb.toString());

    }

    /**
     * 698表密钥下装分帧 处理
     *
     * @param meterAddress 表通讯地址
     * @param taskDatas    APDU
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult myxzsSafeTrans(String meterAddress, String taskDatas, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskDatas", taskDatas);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_myxzsSafeTrans", jb.toString());

    }

    /**
     * 密钥协商建立连接
     *
     * @param meterAddress 表通讯地址
     * @param m1           APDU
     * @param s1           APDU
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult myxs(String meterAddress, String m1, String s1, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("m1", m1);
            jb.put("s1", s1);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_myxs", jb.toString());

    }

    /**
     * 获取698表esam信息
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getEsamInfoFrame(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getEsamInfoFrame", jb.toString());

    }

    /**
     * 获取698表esam号
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getEsamNum(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getEsamNum", jb.toString());

    }

    /**
     * 获取698表表号
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getMeterNum(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getMeterNum", jb.toString());

    }

    /**
     * 获取698表电表状态
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getMeterStatu(String meterAddress, String taskData, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getMeterStatu", jb.toString());

    }

    /**
     * 获取698表通信地址
     *
     * @param mode 通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getMeterAddress(int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getMeterAddress", jb.toString());

    }

    /**
     * 获取698表电表时间
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getMeterTime(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getMeterTime", jb.toString());

    }

    /**
     * 读取698表当前正向有功电能数据
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getCurrentEnergy(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getCurrentEnergy", jb.toString());

    }

    /**
     * 读取698表当前反向向有功电能数据
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getCurrentReverse(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getCurrentReverse", jb.toString());

    }

    /**
     * 读取698表当前电压
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getCurrentU(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getCurrentU", jb.toString());

    }

    /**
     * 读取698表当前电流
     *
     * @param meterAddress 表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult getCurrentI(String meterAddress, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getCurrentI", jb.toString());

    }

    /**
     * 698表电表校时
     *
     * @param mode 通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult checkTime(int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_checkTime", jb.toString());

    }

    /**
     * 698表红外认证请求
     *
     * @param meterAddress 通信地址
     * @param random1      随机数1
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:linkUserData      返回-表号
     * :List<String> datas(code==其他): size==1
     * 0:错误描述
     */
    public ReturnResult infraGetRandom1Ciper(String meterAddress, String random1, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("random1", random1);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_infraGetRandom1Ciper", jb.toString());

    }

    /**
     * 698表红外认证指令
     *

     * @param meterAddress  通信地址
     * @param random2Cipher 随机数密文2
     * @param mode
     * @return
     */
    public ReturnResult infraCheckRandom2Ciper(String meterAddress, String random2Cipher, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("random2Cipher", random2Cipher);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_infraCheckRandom2Ciper", jb.toString());

    }

    /**
     * 读取集中器日冻结正向有功电能数据
     *
     * @param meterAdress 地址
     * @param taskData    任务数据
     * @return
     */
    public ReturnResult getDayFreezEnergy(String meterAdress, String taskData)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAdress", meterAdress);
            jb.put("taskData", taskData);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_getDayFreezEnergy", jb.toString());

    }

    /**
     * 集中器
     * 解密电表返回的密文数据
     *
     * @param bcDownFrame 执行跳闸命令电表返回报文
     * @return 成功返回链路数据   失败 返回空
     */
    public ReturnResult parserJzqBcFrame(String bcDownFrame)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", bcDownFrame);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_parserJzqBcFrame", jb.toString());

    }

    /**
     * 设置通信超时时间，如何串口已经打开，则改变为关闭状态，需要重新打开后生效
     *
     * @param sendTimeOut    发送超时时间 毫秒
     * @param receiveTimeOut 接收超时时间 毫秒
     */
    public void setInfraTimeOut(int sendTimeOut, int receiveTimeOut)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("sendTimeOut", sendTimeOut);
            jb.put("receiveTimeOut", receiveTimeOut);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        HardWareUtil.requestHardwareData("meter698_setInfraTimeOut", jb.toString());

    }

    public ReturnResult safeTransSc(String meterAddress, String taskData, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_safeTransSc", jb.toString());

    }

    public ReturnResult safeTransOAD(String meterAddress, String oi, int mode, boolean checkDar)  {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("oi", oi);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter698_safeTransOAD", jb.toString());

    }

    /**
     * 根据数据域生成698报文
     *
     * @param dataSpace 数据域
     * @param comAddr   通讯地址
     * @return
     */
    @Override
    public ReturnResult build698Frame(String dataSpace, String comAddr) throws RemoteException {
        JSONObject jb = new JSONObject();
        try {
            jb.put("dataSpace", dataSpace);
            jb.put("comAddr", comAddr);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("build698Frame", jb.toString());
    }

}
